package http

import (
	"net/http"

	"gitee.com/go-kade/librarys/ioc"
	"gitee.com/go-kade/librarys/ioc/config/application"
	"gitee.com/go-kade/librarys/ioc/config/trace"
	"github.com/emicklei/go-restful/v3"
	"go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful"
)

type GoRestfulRouterBuilder struct {
	*RouterBuilderHooks
}

func NewGoRestfulRouterBuilder() *GoRestfulRouterBuilder {
	return &GoRestfulRouterBuilder{
		RouterBuilderHooks: NewRouterBuilderHooks(),
	}
}

func (b *GoRestfulRouterBuilder) Build() (http.Handler, error) {
	//1. 是一个RESTful服务的容器，它用于注册和管理RESTful API的路由和处理函数。
	r := restful.DefaultContainer
	//这行代码设置了默认的响应内容类型为JSON
	//这意味着当客户端向服务器发出请求时，如果未指定特定的Accept头，服务器将以JSON格式作为默认响应内容类型返回数据。
	restful.DefaultResponseContentType(restful.MIME_JSON)
	//这行代码设置了默认的请求内容类型为JSON
	//如果客户端发送的请求未指定特定的Content-Type头，服务器将期望请求体以JSON格式进行编码。
	restful.DefaultRequestContentType(restful.MIME_JSON)

	// trace中间件
	if trace.Get().Enable && Get().EnableTrace {
		//otelrestful.OTelFilter 函数或方法。这个函数可能接受应用程序名称作为参数，并返回一个过滤器，用于处理HTTP请求。
		filter := otelrestful.OTelFilter(application.Get().AppName)
		//这行代码将上一步创建的过滤器应用到路由器（或者说框架的路由器 r）中，以便对请求进行处理。这可能是一个将 OpenTelemetry 集成到 RESTful 服务中的步骤，通过这个过滤器可以将跟踪信息添加到处理的请求中。
		r.Filter(filter)
	}

	// 开启Debug
	if Get().Debug {
		restful.EnableTracing(true)
	}

	// 装载Ioc路由之前
	for _, fn := range b.Before {
		fn(r)
	}

	// 装置子服务路由1
	ioc.LoadGoRestfulApi(Get().HTTPPrefix(), r)

	// 装载Ioc路由之后
	for _, fn := range b.After {
		fn(r)
	}
	return nil, nil
}
